perm filename UDP.FAI[MUS,LCS] blob
sn#159145 filedate 1975-05-16 generic text, type T, neo UTF8
00100 TITLE UDPLAY ; WITH 'LOCK' OCT. 1970. MAY 1975
00200
00300 ; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
00400 ; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
00500 ;
00600 ; READS FROM UDP DATA WRITTEN WITH 'CONVRT', THE FIRST RECORD OF WHICH
00700 ; CONTAINS THE NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
00800 ; IF 'BLKS' IS CHANGED, ALSO CHANGE IT IN 'CONVRT'.
00900
01000 ↓A ← 1 ;WORK
01100 B ← 2 ;WORK
01200 C ← 4 ;WORK
01300 RET ← 3 ;RETURN ACCUMULATOR
01400 ↓P ← 17 ;A PDL
01500 PLEN← 10 ;SIZE OF PDL
01600
01700 NOWAIT←400 ; INHIBIT 'XXX is busy, will you wait?`
01800
01900 EXTERNAL JOBFF,JOBREL,JOBSA,JOBSYM
02000
02100 ;** CHANGE NEXT TO 14 FOR 'UDPBIG' (TO PLAY AT HIGH SRATES-DOUBLES CORE)
02200 ;SEE IF 20 RATHER THAN 7 KEEPS US GOIN'
02300 ;BLKS ← =18
02400 BLKS ← =10
02500
02600 ;**** 1312 IS FOR 2314 DSK. CHANGE NUMBER IF NEEDED FOR 3330 DSK. *****
02700 BUFSIZ ←=2336*BLKS
02800
02900 ↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
03000 ↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
03100
03200 OPDEF READCH [51B8]
03300 OPDEF MESSAGE [51B8!3B12]
03400 OPDEF LOCK [CALLI 400076]
03500 OPDEF UNLOCK [CALLI 400077]
03600
03700 BEG: HLRO A,JOBSYM ;SAVE SYMBOLS
03800 MOVN A,A
03900 ADD A,JOBSYM
04000 HRLM A,JOBSA
04100 HRRZM A,JOBFF
04200 CALLI 0 ;RESET I/O DEVICES
04300 MOVE P,[IOWD PLEN,PLIST]
04400 MESSAGE [ASCIZ/
04500 *** Play from the UDP (with Spacewar) ***
04600 /]
04700 PUSHJ P,GETUDP ;MAKE SURE WE HAVE UDP BEFORE DOING DIALOGUE
04800
04900 ;FIND OUT NUMBER OF CHANNELS AND
05000 ;THE SPEED.
05100 NCHNS: MESSAGE [ASCIZ/
05200 How many channels? /]
05300 READCH A
05400 CAIE A,175
05500 CAIN A,177
05600 JRST BEG
05700 CAIE A,15
05800 CAIN A,12
05900 JRST NCHNS+1
06000 SUBI A,"0"+1 ;CONVERT TO BINR AND ADD 1
06100 CAIG A,3
06200 SKIPGE A
06300 JRST [ OUTSTR [ASCIZ/
06400 Illegal number of channels/]
06500 JRST NCHNS]
06600 DPB A,[POINT 2,OUTBIT,26]
06700
06800 SETSPD: MESSAGE [ASCIZ/
06900 What is the speed? /]
07000 READCH A
07100 CAIE A,175
07200 CAIN A,177
07300 JRST BEG
07400 CAIE A,15
07500 CAIN A,12
07600 JRST SETSPD+1
07700 SUBI A,"0"
07800 CAIG A,5
07900 SKIPG A
08000 JRST [ OUTSTR [ASCIZ/
08100 Illegal speed/]
08200 JRST SETSPD]
08300 DPB A,[POINT 3,OUTBIT,32]
08400 ; GET READ TO PLAY
08500
08600 LX: MESSAGE [ASCIZ/
08700 Type 'P` to play: /]
08800 readch a
08900 CAIE A,175
09000 CAIN A,177
09100 JRST BEG
09200 CAIE A,15
09300 CAIN A,12
09400 JRST LX+1
09500 caie a,"P"
09600 jrst LX
09700 PUSHJ P,[
09800 GETUDP: INIT DSKCHN,NOWAIT+17 ;MODE
09900 SIXBIT/UDP/ ;DEVICE NAME
10000 0 ;NO BUFFER HEADERS
10100 SKIPA
10200 POPJ P,
10300 OUTSTR [ASCIZ/
10400 UDP is in use or assigned to another job.
10500 /]
10600 HALT BEG] ;RESTART IF DEVICE IS UNAVAILABLE
10700
10800 ENTER DSKCHN,[0
10900 0
11000 0
11100 0]
11200 JRST [ OUTSTR [ASCIZ/
11300 I'm sorry, but I don't believe that you have the Scratch Pack mounted.
11400 Maybe someone has put a password on it.
11500 /]
11600 HALT BEG] ;FOR NEW UDP CODE
11700 MOVEI A,BUFSIZ+1 ;GET FIRST BUFFER FOR UDP
11800 PUSHJ P,GETBUF
11900 SUBI A,1
12000 MOVEM A,PBUF1
12100 MOVEI A,BUFSIZ+1 ;GET SECOND BUFFER FOR UDP
12200 PUSHJ P,GETBUF
12300 SUBI A,1
12400 MOVEM A,PBUF2
12500 GETAD: OPEN ADCHN,[117 ;MODE
12600 'AD ' ;DEVICE NAME
12700 0] ;NO BUFFER HEADERS
12800
12900 JRST [OUTSTR [ASCIZ/
13000 D to A is unavailable.
13100 /]
13200 HALT GETAD]
13300 ;HALT IF D-A IS UNAVAILABLE
13400
13500
13600 INPUT DSKCHN,[IOWD 22,NWD ;READ IN BLOCK CONTAINING EITHER
13700 0 ] ;THE ADDRESS OF THE SCRATCH AREA
13800 MOVE NWD ;AND THE WORD COUNT, OR AN INDIC-
13900 CAME [SIXBIT/BITMAP/] ;ATION THAT THE SOUND STARTS IN
14000 JUMPN [ MOVEI 1 ;BLOCK #1
14100 MOVEM BLKNUM
14200 JRST PLA2]
14300 NOTHIN: JUMPE [ OUTSTR [ASCIZ/NOTHING THERE!!!/]
14400 CALLI 12]
14500 SKIPE A,NWD+20
14600 SKIPN B,NWD+21
14700 JRST NOTHIN
14800 MOVEM A,BLKNUM
14900 MOVEM B,NWD
15000 PLA2: MOVEI A,10
15100 ; MOVEM A,WT#
15200 SETOM A,WT#
15300 SETZM OUTWC
15400 ;; OUTSTR[ASCIZ/WAITING TO BE LOCKED IN CORE.../]
15500 LOCK
15600 ;; OUTSTR[ASCIZ/OK
15700 ;;/]
15800 ;; SPCWAR 17,SWJOB
15900 MOVEI A,1
16000 SKIPL WT
16100 JRST[ CALLI A,31
16200 JRST .-1]
16300 MESSAGE [ASCIZ/
16400 GO? /]
16500 READCH A
16600 CAIE A,175
16700 CAIN A,177
16800 JRST BEG
16900 MOVE A,[SIXBIT/GOT 6!/]
17000 CALLI A,400002
00100 ; BEGIN MAIN BODY OF PROGRAM
00200
00300 SETZM DATERR
00400 SETZM RUDONE
00500 SETZM PDPERR
00600 LOOP: JSP RET,SUB ;ROUTINE TO READ AND WRITE
00700 PBUF1: 0 ;BUF1-1 ;USE BUF1 FOR THE I/O
00800 JUMPLE B,OUT1 ;DONE
00900
01000 JSP RET,SUB ;CALL IT AGAIN
01100 PBUF2: 0 ;BUF2-1 ;USE BUF2 FOR THE I/O
01200 JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
01300 OUT1: SKIPN RUDONE
01400 JRST OUT1
01500 OUT: UNLOCK ;UNLOCK US FROM CORE!
01600 ;; SPCWAR 0,'SSW'
01650
01700 MOVE A,[SIXBIT/UDPLAY/]
01800 CALLI A,400002
01900 close dskchn, ;END OF PROGRAM.
02000 releas adchn,
02050 RELEASE 16,
02100 CALLI 0 ;RESET I/O AND FREE BUFFER SPACE
02200 SHRINK: MOVE A,JOBFF
02300 CALL A,[SIXBIT/CORE/]
02400 JRST [ OUTSTR[ASCIZ/
02500 HORRIBLE ERROR! CAN'T SHRINK CORE!!!
02600 /]
02700 HALT SHRINK]
02800 SKIPE DATERR
02900 JRST[ MESSAGE[ASCIZ/
03000 Data transmission error.
03100 /]
03200 JRST LX]
03300 SKIPE PDPERR
03400 JRST[ MESSAGE[ASCIZ/
03500 The PDP-6 is hung, try restarting it.
03600 /]
03700 CALLI 12]
03800 SKIPLE NWD
03900 JRST [ MESSAGE[ASCIZ/
04000 %*#%*!% SYSTEM, CAN'T GET UDP ACCESS FAST ENOUGH OR NOT BEING RUN QUICKLY ENOUGH,
04100 TRY AGAIN, AND IF YOU STILL LOSE, SEE IF YOU CAN GET PEOPLE TO STOP WHILE
04200 YOU TRY A THIRD(?) TIME.
04300 GOOD LUCK!
04400 /]
04500 JRST LX]
04600 jrst LX
00100 ; SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
00200 ; 1(RET) WILL BE THE RETURN
00300 ; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
00400 ; PUT IN THE RIGHT HALF OF THE IOWD.
00500 ; A WILL BE A WORK REGISTER
00600 ; B WILL BE TESTED ON THE OUTSIDE.
00700
00800 SUB: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
00900 ADDB A,NWD ;A←NWD-BUFSIZ
01000 ;NWD←NWD-BUFSIZ
01100 MOVE B,A ;SAVE B TO BE TESTED FOR LAST
01200 ;TIME.
01300 JUMPLE A,LAST ;SET UP FOR LAST TIME.
01400 MOVEI A,0
01500
01600 ;THE IOWD LOOKS LIKE:
01700 ; [-BUFSIZ / BUFI-1]
01800
01900 LAST: ADDI A,BUFSIZ
02000 MOVNS A ;COMPLEMENT A
02100 HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
02200 ;TO THE LEFT SIDE OF A.
02300 MOVSM A,INLIST ;SWAP A AND MOVE IT.
02400 MOVEI C,5*=60 ;IF IT DOESN'T RESPOND IN 5 SECONDS, ASSUME PDP-6
02500 ;IS HUNG
02600 FULOOP: SKIPGE OUTWC
02700 JRST [ SETZ 0
02800 CALLI 31 ;SLEEP FOR A TICK
02900 SOJGE C,FULOOP
03000 SETOM PDPERR
03100 JRST OUT]
03200 SKIPE RUDONE
03300 JRST OUT
03400 INPUT DSKCHN,INLIST ;READ A RECORD.
03500 MOVSM A,OUTWC ;SAME FOR OUTPUT.
03600 MOVEI A,BLKS
03700 ADDM A,BLKNUM
03800 JRST 1(RET) ;RETURN
00100 ; SPACE WAR JOB
00200
00300 BEGIN SWJOB
00400
00500 ↑SWJOB: SOSL WT
00600 CALLI 400024
00700 SKIPL OUTWC
00800 CALLI 400024
00900 MOVE 1,OUTWC
01000 SETZM OUTWC
01100 SKIPE RUDONE
01200 CALLI 400024
01300 CONSZ 40 ;CHECK TO SEE IF ON THE PDP-6
01400 JRST[ SETOM PDPERR
01500 SETOM RUDONE
01600 CALLI 400024]
01700 CONO 4,400
01800 MOVE 2,OUTBIT
01900 CONO 424,(2)
02000 MOVE 2,OUTWC+1
02100 CONO 204,(2)
02200 L1: CONSO 204,1000
02300 JRST L1
02400 BLKO 204,1
02500 JRST[ MOVE 1,OUTWC
02600 SETZM OUTWC
02700 JUMPL 1,L1
02800 CONSZ 204,10000
02900 EHO: SETOM DATERR
03000 SETOM RUDONE
03100 CONO 4,200
03200 CALLI 400024]
03300 JRST L1
03400 ↑PDPERR: 0
03500 ↑DATERR: 0
03600 ↑RUDONE: 0
03700 BEND SWJOB
00100 ; GETBUF - MAKE AN I/O BUFFER
00200
00300 BEGIN ALLOC
00400
00500 ↑GETBUF:ADD A,JOBFF
00600 PUSH P,A ;SAVE WHAT WILL BE JOBFF
00700 GETBU2: CALL A,[SIXBIT/CORE/]
00800 JRST [ OUTSTR [ASCIZ/
00900 Can't get enough core!
01000 /]
01100 MOVE A,(P) ;RECOVER WHAT SHOULD BW JOBFF
01200 HALT GETBU2] ;ALLOW THE LOSER TO TRY AGAIN
01300 POP P,A ;RECOVER WHAT WILL BE JOBFF
01400 EXCH A,JOBFF
01500 POPJ P,
01600
01700 BEND ALLOC
00100 ; STORAGE:
00200
00300 NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
00400 BLOCK 21 ;TO GET SCRATCH ADDRESS
00500 CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
00600 0
00700
00800 INLIST: 0 ;WILL CONTAIN AN IOWD
00900 BLKNUM: 0
01000
01100 OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
01200 3650 ;MAGIC BITS FOR 136.
01300 OUTBIT: 4000 ;BITS FOR D-A
01400 BLOCK 2
01500 PLIST: BLOCK PLEN
01600
01700 PATCH: BLOCK 20
01800
01900 end beg